【发布时间】:2013-06-13 11:13:19
【问题描述】:
我有这样的 JPA 实体:
@Entity
@Table(name = "ATTRIBUTE")
public class Attribute {
//ID stuff
@Column(name = "NAME", nullable = false)
private String name;
@Column(name = "VALUE", nullable = false)
private String value;
//getters and setters
}
还有另一个实体:
@Entity
@Table(name = "ATTRIBUTE_GROUP")
public class AttributeGroup {
//ID stuff
@ElementCollection(fetch = FetchType.LAZY, targetClass = java.lang.String.class)
@CollectionTable(name = "ATTRIBUTE")
@MapKeyColumn(name = "NAME")
@Column(name = "VALUE")
private Map<String, String> attributes = new HashMap<>();
public void createAttribute(String name, String value) {
Attribute attribute = new Attribute();
attribute.setName(name);
attribute.setValue(value);
attribute.setAttributeGroup(this);
attributes.put(name, value);
}
public Map<String, String> getAttributes() {
return attributes;
}
}
我需要在AttributeGroup 实体中有一个映射,它将Attribute 的名称作为键,Attribute 的值作为值。
目前的方法对我不起作用。当我尝试将记录持久保存到数据库时,它会生成事务仅标记为回滚的异常。我什至不知道它是否是执行此操作的写入方式,如果它不工作显然不是。
如何在 JPA 中实现这一点,以便在 AttributeGroup 中创建由 Attribute 名称/值配对对象制成的映射?
我正在通过 EntityManager 使用 Hibernate。
【问题讨论】:
-
必须使用hibernate注解吗?我们不能进行 xml 映射吗?
-
是的,我需要坚持使用 JPA 方法,hibernate 只是一个实现,因为我们将来可能会迁移到 OpenJPA。
-
发布异常的完整堆栈跟踪,以及导致它的代码。另外,属性实体的意义何在?你好像没用过。您在方法中创建了一个新属性,但不对其进行任何操作。
-
我用 AttributeGroup 表引用它:attribute.setAttributeGroup(this);
-
是的,但是您的代码在那里什么也没做。
attribute的实例已创建,您确实调用了attribute.setAttributeGroup(this),但随后您什么也不做(例如,您不持久保存它),因此您所做的一切都会丢失。
标签: java hibernate jpa persistence