字符串作为用户[EclipseLink]

时间:2017-05-27 11:37:17

标签: java jpa eclipselink derby

[INTRO]

  1. 数据库:Apache Derby
  2. JPA:EclipseLink
  3. 嘿,我正在寻找答案但是在这里找不到任何答案。我正在编写简单的数独应用程序,我想要添加的下一个功能是将我的数独板保存在数据库中,并在需要时检索它们。这是我的两个主要类的UML图: SudokuBoard.uml 我的两个实体的结构如下:

    SudokuBoard实体:

    @Entity
    public class SudokuBoard implements Serializable, Cloneable {
    
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    
    private static final long serialVersionUID = 1L;
    
    @OneToMany(cascade=CascadeType.PERSIST)
    private ArrayList<SudokuField> board;
    
    public ArrayList<SudokuField> board() {
        return board;
    }
    
    public void setBoard(ArrayList<SudokuField> board) {
        this.board= board;
    }
    
    public Long etId() {
        return id;
    }
    
    public void setId(Long id) {
        this.id = id;
    } 
    

    SudokuField实体:

    @Entity
    public class SudokuField implements Serializable, Comparable<SudokuField>, 
    Cloneable {
    
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    
    @Transient
    private static final Logger logger = 
    LoggerFactory.getLogger(SudokuField.class);
    @Transient
    private static final long serialVersionUID = 1L;
    
    @Basic(fetch = FetchType.EAGER)
    @Column(name = "Value")
    private int value;
    
    @ManyToOne
    @JoinColumn(name = "board_fk", referencedColumnName = "id")
    private SudokuBoard sudokuBoard;
    

    在DAO中执行:

    @Override
    public void write(SudokuBoard obj, String path) throws 
    FileNotFoundException, IOException {
        entityManager.getTransaction().begin();
        entityManager.persist(obj);
        entityManager.getTransaction().commit();
    }
    

    [问题]

    1. 我想知道是否有可能不使用自动生成的密钥,而是在SudokuBoard实体中使用String作为PK。在我的应用程序中,我实现了绑定,所以我想保存SudokuBoard的相同对象,它随着时间的推移在不同的名称下变化。
    2. 希望我明确表达了我的意图。感谢您提供帮助和提示如何完成。

1 个答案:

答案 0 :(得分:1)

使用String作为主键非常简单 - 只需声明它并删除@GeneratedValue注释即可。

但是,更改主键(如果这是'在不同名称下保存同一个对象(...)'的意思)是不可能的。如果您尝试persist/merge不同主键下的现有实体,JPA将引发异常或将其视为新实体,从而导致数据库中出现重复条目​​。简而言之,为实体分配id是永久性的。

总而言之,我建议您保留一个自动生成的代理键,并为该名称声明另一个唯一的String字段。使用技术领域传递商业信息很少是个好主意。