2012-04-23 28 views
0

我想將運行時生成的實體UUID複製到另一個字段。 實體ID經由代碼生成描述如下:持續時間複製實體ID

package eclipselink.example; 
public class UUIDSequence extends Sequence implements SessionCustomizer { 
    public UUIDSequence() { 
     super(); 
    } 
    public UUIDSequence(String name) { 
     super(name); 
    } 
    @Override 
    public Object getGeneratedValue(Accessor accessor, 
      AbstractSession writeSession, String seqName) { 
     return UUID.randomUUID().toString().toUpperCase(); 
    } 
    ... 
    public void customize(Session session) throws Exception { 
     UUIDSequence sequence = new UUIDSequence("system-uuid"); 
     session.getLogin().addSequence(sequence); 
    } 
} 

Persitence.xml:

property name="eclipselink.session.customizer" value="eclipselink.example.UUIDSequence" 

實體:

public abstract class MyEntity{ 
    private String id; 
    private String idCopy; 

    @Id 
    @Basic(optional = false) 
    @GeneratedValue(generator="system-uuid") 
    @XmlElement(name = "ID") 
    public String getId() { 
     return id; 
    } 
} 

如何可以指示JPA(Eclipse的鏈路)將運行時生成的UUID複製到idCopy字段?

回答

0

我不是100%肯定這將工作(我不知道的EclipseLink調用調節器或現場直接分配),但是這給一試:

public abstract class MyEntity{ 
    private String id; 
    private String idCopy; 

    @Id 
    @Basic(optional = false) 
    @GeneratedValue(generator="system-uuid") 
    @XmlElement(name = "ID") 
    public String getId() { 
     return id; 
    } 

    public void setId(String id) { 
     this.id = id; 
     this.idCopy = id; 
     // or 
     // this.setIdCopy(id); 
    } 
} 
+0

該解決方案是可行的,但在實體從MyEntity繼承的情況下,我可能需要不同的idCopy值(例如,使用根父級的id設置idCopy)。是否可以使用@PrePersist? Eclipse Link在保持持久性之前保證UUID存在嗎? – user1062078 2012-04-23 16:09:17

+0

您可以隨時重寫子類中的'setId()'以表現不同。我不確定'@ PrePersist',但它應該很容易就可以自己測試行爲。 – 2012-04-23 16:16:59