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();
}
[问题]
希望我明确表达了我的意图。感谢您提供帮助和提示如何完成。
答案 0 :(得分:1)
使用String
作为主键非常简单 - 只需声明它并删除@GeneratedValue
注释即可。
但是,更改主键(如果这是'在不同名称下保存同一个对象(...)'的意思)是不可能的。如果您尝试persist/merge
不同主键下的现有实体,JPA将引发异常或将其视为新实体,从而导致数据库中出现重复条目。简而言之,为实体分配id是永久性的。
总而言之,我建议您保留一个自动生成的代理键,并为该名称声明另一个唯一的String
字段。使用技术领域传递商业信息很少是个好主意。