Hibernate - 同步映射同一列的两个属性

时间:2014-09-10 20:15:35

标签: java hibernate jpa

是否可以在映射到同一列的同一实体上保持同步两个属性(使用基本JPA或hibernate)?

我有两个属性:

@JoinColumn(referencedColumnName = "id", insertable = false, name = "parent", updatable = false)
@ManyToOne(fetch = FetchType.LAZY)
private Person parent;
@Column(name = "parent")
private Integer parentId;

基本上,我想要以下内容:

System.out.println(element.getParentId());
System.out.println(element.getParent().getId());
element.setParentId(2);
System.out.println(element.getParentId());
System.out.println(element.getParent().getId());

这是打印“3,3,2,2”而不是“3,3,2,3”。

是否可以(不在getParent()getter上编写自定义延迟加载?)

提前谢谢

3 个答案:

答案 0 :(得分:2)

IIRC,Hibernate不会为你做那件事。如果你有这样的东西,你就是那个人(我记得做过类似的事情)。

第一个解决方案是先保存实体,然后使用实体管理器进行刷新。

element.setParentId(2);
entityManager.merge(element);
entityManager.refresh(element);

刷新将使它再次从数据库中获取对象,并且它将具有正确的值。

我做的第二个选项是更改实体的setter以维持状态。类似的东西:

public void setParent(Parent parent) {
    this.parent = parent;
    parentId = parent.id;
}

答案 1 :(得分:0)

试试这个

@JoinColumn(referencedColumnName = "id", insertable = false, name = "parent")
@ManyToOne(fetch = FetchType.LAZY)
private Person parent;


@Column(name = "parent")
private Integer parentId;

如果那不起作用:

如果parentId是Parent实体的主键,请尝试此操作:

@JoinColumn(referencedColumnName = "id", insertable = false, name = "parent")
@ManyToOne(fetch = FetchType.LAZY)
private Person parent;

@Id
@GeneratedValue(strategy = GenerateType.AUTO)
@Column(name = "parent")
private Integer parentId;

试试这个:

@JoinColumn(referencedColumnName = "id", name = "parent")
@ManyToOne(fetch = FetchType.LAZY)
private Person parent;


@Column(name = "parent")
private Integer parentId;

如果那不起作用:

试试这个:

@JoinColumn(name = "parent")
@ManyToOne(fetch = FetchType.LAZY)
private Person parent;


@Column(name = "parent")
private Integer parentId;

答案 2 :(得分:0)

您可以为同一列创建两个属性,如下所示:

import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

public class Pixel
 {


  public Pixel() throws Exception
   {

    try 
     {
      BufferedImage image   = ImageIO.read(new File("1.jpg"));
      int iW = image.getWidth();
      int iH = image.getHeight();
      int a[][][] = new int[255][255][255];

      for(int i=0;i<iH;i++)
       {
        for(int j=0;j<iW;j++)
         {
          Color c = new Color(image.getRGB(j, i));
          a[c.getRed()][c.getGreen()][c.getBlue()]++;

         }
      }
     for(int i=0;i<255;i++)
      {
       for(int j=0;j<255;j++)
        {
         for(int k=0;k<255;k++)
          {
           if(a[i][j][k]>0)
           {
            System.out.println("colour["+i+"]["+j+"]["+k+"] repeated "+a[i][j][k]+"times \n");
            //i->Red j-Green k->Blue                        

         }
       }
     }
    } 
  }

catch(Exception e){}
}
public static void main(String[] args) throws Exception
{
    Pixel s1 = new Pixel();
}   

}

检查代码中的输出将如下所示:

@JoinColumn(name = "CGRADO_CODIGO", referencedColumnName = "CGRADO_CODIGO")
    @ManyToOne
    @NotFound(action=NotFoundAction.IGNORE)
    private SipreGrado                  sipreGrado;

    @Column(name = "CGRADO_CODIGO",insertable=false,updatable=false)
    private String                      sipreGradoCodigo;

sipreGradoCodigo   "001"
sipreGrado         null

请记住,如果您有时将实体设为NULL,则可以使用该注释跳过它

sipreGradoCodigo   "001"
sipreGrado         Entity SipreGrado ["001","other property","etc"]

另外,请记住设置

@NotFound(action=NotFoundAction.IGNORE)

表示您不希望包含在插入/更新查询中的那个。