休眠级联PERSIST
我有一个关于休眠的一般问题,我打电话。休眠级联PERSIST
我有A类和B类,B是依赖于
在我的代码,当我打电话em.persist(objOfTypeA)我希望插入去,并插入到两个表AAA和BBB。如果我手动设置A获得A的ID并将其填充到每个对象的列表中,然后保留该列表,那么事情就会起作用。 但我希望这发生在Hibernate的神奇。
我做错了什么? 或者我只是期待太多的Hibernate?
感谢
@Entity
@Table(name = "AAA")
@Veto
public class A {
@Id
@GeneratedValue
@Column(name = "Id")
private Long id;
@NotNull
@Column(name = "Name")
private Long name;
...
@OneToMany(mappedBy="a", fetch=FetchType.LAZY, cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE})
private List<B> b;
...
}
@Entity
@Table(name = "BBB")
@Veto
public class B {
@Id
@GeneratedValue
@Column(name="Id")
private Long id;
@NotNull
@Column(name="AId")
private Long aId;
@NotNull
@Column(name = "Name")
private Long name;
@JoinColumn(name = "AId", referencedColumnName="Id", updatable = false, insertable = false)
@ManyToOne(optional = false)
private A a;
...
}
我终于搞定了。 无我被赋予或发现的例子告诉我到底什么是错的,这是只有在我自己的实验,我成功地得出这样的结论:
,而不必
@OneToMany(mappedBy="a", fetch=FetchType.LAZY, cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE})
private List<B> b;
这没”将不起作用(FK仍然为NULL来)
该做的工作:
@OneToMany(fetch=FetchType.LAZY, cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE})
@JoinColumn(name="AId")
@NotNull
private List<B> b;
修改B
如下类的映射,
@Entity
@Table(name = "BBB")
@Veto
public class B {
@Id
@GeneratedValue
@Column(name="Id")
private Long id;
@NotNull
@Column(name="AId", updatable = false, insertable = false)
private Long aId;
@NotNull
@Column(name = "Name")
private Long name;
@JoinColumn(name = "AId", referencedColumnName="Id")
@ManyToOne(optional = false)
private A a;
...
}
你用在错误的地方属性updatable = false, insertable = false
,我已经改正了。
阅读here了解它们是如何工作的。
嗨ManuPK, 谢谢您回答,但这并没有解决我的问题。 虽然试图坚持(A)我得到一个错误,aId B为空。 ConstraintViolationImpl {interpolatedMessage ='may not be null',propertyPath = aId,rootBeanClass = class com.test.model.B,messageTemplate ='{javax.validation.constraints.NotNull.message}'} 我不确定如果在SQL Server端,我必须将id(A和B)作为标识,否则Hibernate会处理这个问题?但我认为没关系,因为它没有抱怨它在FK上抱怨。 – WonkeyDonkey 2012-02-26 12:44:05
DB正在寻找这样的: 表1:AAA 标识BIGINT NOT NULL, 名称为varchar(100) 表2:BBB 标识BIGINT NOT NULL, 援助BIGINT NOT NULL, 名称为varchar(100) 谢谢! – WonkeyDonkey 2012-02-26 12:44:40
我回到数据库并从AId中删除'not null',并从B类中的aId中删除了 @NotNull。现在坚持是成功的但是当我看着数据库。 AAA是好的,但BBB缺少AId。 帮助.. – WonkeyDonkey 2012-02-26 13:01:34
这不适合我。问题在于Hibernate希望在持久化之前将A设置在B上。这工作:http://stackoverflow.com/questions/1795649/jpa-persisting-a-one-to-many-relationship – 2016-01-11 03:48:01