我目前正在尝试使用 Hibernate 编辑我的第一个数据库。我有两个表:testobject_typ 和 testobject。测试对象具有测试对象类型。
问题是:当我将新的测试对象写入数据库时,会使用新 ID 创建新的测试对象类型,即使已存在具有匹配名称的条目。
如何防止 Hibernate 创建新条目并改用同名的现有条目?
我的 Java 类如下所示:
@Entity
@Table(name = "testobject")
public class TestObject {
@Id
@Column(name="testobject_id")
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
@Column(name = "mc_id")
private int mcid;
@Column(name = "name")
private String name;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name="testobjecttyp_id")
private TestObjectTyp testObjectTyp;
@Entity
@Table(name = "testobject_typ")
public class TestObjectTyp {
@Id
@Column(name="testobjecttyp_id")
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
@Column(name = "name")
private String name;
测试对象服务
@Override
public synchronized boolean addTestObject(TestObject testObject){
if (testobjectDao.testObjectExists(testObject.getMcid())) {
return false;
} else {
testobjectDao.addTestObject(testObject);
return true;
}
}
测试对象DAO
public class TestobjectDao implements ITestobjectDao {
@PersistenceContext
private EntityManager entityManager;
@Override
public void addTestObject(TestObject testObject) {
entityManager.persist(testObject);
}
@Override
public boolean testObjectExists(int mcid) {
String hql = "FROM TestObject as to WHERE to.mcid = ?";
int count = entityManager.createQuery(hql).setParameter(1, mcid).getResultList().size();
return count > 0 ? true : false;
}
我如何创建实体:
TestObject testObject = new TestObject();
TestObjectTyp testobjectTyp = new TestObjectTyp();
testobjectTyp.setName(TestobjectTypes.specification);
testObject.setTestObjectTyp(testobjectTyp);
testObject.setMcid(110);
testObject.setName("Test");
iDatabaseService.addTestObject(testObject);
根据您的评论:
是的,如果您只是创建实体的新实例然后保存它(在这种情况下通过级联),则 hibernate 将在 db 中创建一个新行。
而不是做
TestObjectTyp testobjectTyp = new TestObjectTyp();
testobjectTyp.setName(TestobjectTypes.specification);
您应该为该 TestObjectTyp 查询数据库
例如
"FROM TestobjectTypes tot WHERE tot.name = ?";
不同之处在于,现在 hibernate 知道这个 TestobjectTypes(它被称为托管实体,这意味着该实体的更改将反映在 db 上)并且知道它已经存在于 db 中
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句