首页 > 解决方案 > 在 JPA/Hibernates 中使用 @GeneratorType 时如何知道生成器类中的字段名称

问题描述

作为非主键序列生成的一部分,我@GeneratorType在实体字段上使用。在生成器类中,我需要知道它已被调用的字段。帮助表示赞赏。

@Entity(name = "student")
public class Student {

   @GeneratorType(type = IdGenerator.class, when = GenerationTime.INSERT)
   private Integer secId;
}
    
public class IdGenerator implements ValueGenerator<Integer>{

   @Override
   public Integer generateValue(Session session, Object owner) {
      // I want secId here
   }
}

标签: javahibernatejpa

解决方案


你可以尝试使用这样的东西:

public interface EntityId {
   Integer getId();
}

@Entity(name = "student")
public class Student implements EntityId {
   @GeneratorType(type = IdGenerator.class, when = GenerationTime.INSERT)
   private Integer secId;

   @Override
   public Integer getId() {
      return secId;
   }

   // ...
}

@Entity
public class OtherEntity implements EntityId {

   // ...
}


public class IdGenerator implements ValueGenerator<Integer> {
   @Override
   public Integer generateValue(Session session, Object owner) {
      if (!(owner instanceof EntityId)) {
         throw new IllegalArgumentException("IdGenerator can be used only with entities that implement EntityId interface");
      }
      
      // I want secId here
      Integer id = ((EntityId) owner).getId();
   }
}

如果您使用 Java 14 或更高版本,则可以将模式匹配用于 instanceof作为更优雅的构造。

public class IdGenerator implements ValueGenerator<Integer> {
   @Override
   public Integer generateValue(Session session, Object owner) {
      if (owner instanceof EntityId entityId) {
         // I want secId here
         Integer id = entityId.getId();

         // ...
      } else {
         throw new IllegalArgumentException("IdGenerator can be used only with entities that implement EntityId interface");
      }
   }
}


推荐阅读