0

所以,我有一个包含三个实体的模型:DocumentTemplateOrigin

我的问题的主要来源是我需要Document编号对于TemplateSource是唯一的,但是由于原点是Template(而不是Document)的属性,因此我无法直接为其创建唯一约束——前进的方式。

澄清一下,代码中的模型如下所示:

起源:

@Entity
public class Origin {
    @Id private Long id;
    // ... some other fields
}

模板:

@Entity
public class Template {
    @Id private Long id;
    @Column private Origin origin;
    // ... some other fields
}

文档:

@Entity
public class Document {
    @Id private Long id;
    @Column Template template;
    @Column Long number;
    // ... some other fields
}

因此,Origins 有多个关联的模板,您可以使用模板为 Origin 创建文档。

正如我所说,我的问题的根源是每个来源的文档编号必须是唯一的。我能想到的唯一方法是使用originId的附加字段,并尝试保持更新。

所以,我试图做这样的事情:

@Entity
@Table("documents",
     uniqueConstraints = @UniqueConstraint(columnNames = {"number", "originId"}))
public class Document {
    @Id private Long id;
    @Column Template template;
    @Column Long number;
    // ... some other fields

    // added extra field to use in the constraint:
    @Column Long originId;

    @PrePersist
    @PreUpdate
    private void updateConstraintValue() {
        this.originId = getTemplate().getId();
    }
}

注意:为简洁起见,省略了 getter、setter 和其他样板

但这并不总是适用于 JPA,因为 Template 对象在持久/更新事件时不需要是托管实体(只需要设置一个 id 才能使关系工作)。

然后我现在认为这可能不是最好的方法。所以,我的问题是:

  • 我还有什么其他选择?JPA(或 Hibernate)API 是否有更好的方法来处理这个问题?(我正在使用 JPA 2 和 Hibernate 3.6.10,顺便说一句)
  • 我是否应该只信任客户端代码将 Template 对象与具有正确 id 的 Origin 对象一起传递(即使它可能与数据库中的不同)?
  • 我会更好地在 Document 中映射 Origin 本身,并信任客户端代码以使其与模板保持同步吗?
4

1 回答 1

1

我可能遗漏了一些东西,但是您能否完全摆脱原始 ID 并简单地为文档使用生成的 ID 而不是手动创建一个?您已经有一个 ID 列。看起来您需要做的就是指定生成 ID。

@Entity
@Table("documents" )
public class Document {
    @Id 
    @GeneratedValue( strategy = GenerationType.IDENTITY )
    private Long id;

    @Column Template template;

    @Column Long number;
    // ... some other fields

}

注意:我添加了 GeneratedValue 注释并删除了源 ID

于 2013-01-10T21:17:05.660 回答