Hibernate 重复的数据库条目

西蒙

我目前正在尝试使用 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章