end0tknr's kipple - web写経開発

太宰府天満宮の狛犬って、妙にカワイイ

Entity for java に annotation された @Column や @Id 情報を取得

「spring for java や、seasar2 では、 EntityManager.find(~) や、select().id(~) で、Entityを検索できますが、 これらは、idの型や名称と、どうやって把握しているのだろう?」と思い、調べてみた。

当初、javax.persistence.EntityManager.java の method を辿ればよいと、思っていましたが、 MUserEntity.class.getFields() と Field.getAnnotations() で取得できるみたい。

package jp.end0tknr;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.sql.Timestamp;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.data.jpa.repository.support.JpaEntityInformationSupport;
import org.springframework.data.repository.core.EntityInformation;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class MyController {

    @Autowired
    UserMstService userMstService;

    @Autowired
    MessageSource messageSource;
    @Autowired
    ItemNameProp itemNameProp;

    @PersistenceContext
    EntityManager entityManager;

    @RequestMapping(value="/index4")
    public String index4(Model model) {

        System.out.println("START index4");

        // entityクラスのfield一覧から、@Id 情報を取得
        Field[] fields1 =  MUserEntity.class.getFields();
        for (Field field1 : fields1) {
            System.out.println( field1 );

            Annotation[] annots1 = field1.getAnnotations();
            for (Annotation annot1 : annots1) {
                System.out.println( annot1 );
            }
        }

        // 一方、EntityInformation では、@Id の型は取得できるが
        // @Id の名称は取得できない
        EntityInformation entityInformation1 =
                JpaEntityInformationSupport.getEntityInformation(
                        MUserEntity.class,
                        entityManager);
        System.out.println( entityInformation1.getIdType() );
        System.out.println( entityInformation1.getJavaType() );


        // EntityManger による 検索例 1
        MUserEntity mUserEntity = entityManager.find(
                MUserEntity.class,
                "user@co.jp");
        System.out.println(mUserEntity);

        // EntityManger による 検索例 2 - pkeyが複数
        UserMstEntityPkey userMstEntityPkey = new UserMstEntityPkey();
        userMstEntityPkey.setUserSmileid("end0tknr1");
        userMstEntityPkey.setKyotenId(1);

        UserMstEntity userMstEntity = entityManager.find(
                UserMstEntity.class,
                userMstEntityPkey);
        System.out.println(userMstEntity);

        return "index";
    }
}

↑こう書くと、↓こうeclipseのコンソールに表示されます。

START index4
public java.lang.String jp.end0tknr.MUserEntity.userId
@javax.persistence.Id()
@javax.persistence.Column(nullable=true, precision=0, unique=false, name=user_id, length=255, scale=0, updatable=true, columnDefinition=, table=, insertable=true)
public java.lang.String jp.end0tknr.MUserEntity.password
@javax.persistence.Column(nullable=true, precision=0, unique=false, name=password, length=255, scale=0, updatable=true, columnDefinition=, table=, insertable=true)
public java.lang.String jp.end0tknr.MUserEntity.userName
@javax.persistence.Column(nullable=true, precision=0, unique=false, name=user_name, length=255, scale=0, updatable=true, columnDefinition=, table=, insertable=true)
public java.lang.String jp.end0tknr.MUserEntity.birthday
@javax.persistence.Column(nullable=true, precision=0, unique=false, name=birthday, length=255, scale=0, updatable=true, columnDefinition=, table=, insertable=true)
public java.lang.Integer jp.end0tknr.MUserEntity.age
@javax.persistence.Column(nullable=true, precision=0, unique=false, name=age, length=255, scale=0, updatable=true, columnDefinition=, table=, insertable=true)
public java.lang.Integer jp.end0tknr.MUserEntity.gender
@javax.persistence.Column(nullable=true, precision=0, unique=false, name=gender, length=255, scale=0, updatable=true, columnDefinition=, table=, insertable=true)
public java.lang.Integer jp.end0tknr.MUserEntity.departmentId
@javax.persistence.Column(nullable=true, precision=0, unique=false, name=department_id, length=255, scale=0, updatable=true, columnDefinition=, table=, insertable=true)
public java.lang.String jp.end0tknr.MUserEntity.role
@javax.persistence.Column(nullable=true, precision=0, unique=false, name=role, length=255, scale=0, updatable=true, columnDefinition=, table=, insertable=true)
class java.lang.String
class jp.end0tknr.MUserEntity
MUserEntity(userId=user@co.jp, password=$2a$10$rJyapIrvsHARwCNgporWLO6QIKXXezOpRrdb..7X0ea0VwZ5IldSy, userName=ユーザー1, birthday=2000-01-01, age=21, gender=2, departmentId=2, role=ROLE_GENERAL)
UserMstEntity(kyotenId=1, regXmileid=end0tknr1, regName=end0tknr1, regDate=2021-05-12 00:00:00.0, lastUpdXmileid=end0tknr1, lastUpdName=end0tknr1, lastUpdDate=2021-05-12 00:00:00.0, isDelete=0, version=1, userXmileid=end0tknr1, userName=end0tknr, userShozokugroup=jp, shokumuId=freelance, subShokumuId1=null, subShokumuId2=null, subShokumuId3=null, subShokumuId4=null, isBoss=null, isFirstclassArchitect=null, isSecondclassArchitect=null, isMokuzouArchitect=null, architectTourokuNo=null, architectTourokuTodoufuken=null, architectKoushuuDate=null, kouzouArchitectKoufuNo=null, setsubiArchitectKoufuNo=null, sexyKoushuuDate=null, architectJimushoCode=null, architectJimushoCode2=null, architectJimushoCode3=null, architectJimushoCode4=null, architectJimushoCode5=null, architectJimushoCode6=null, architectJimushoCode7=null, architectJimushoCode8=null, architectJimushoCode9=null, architectJimushoCode10=null, smashCode=smash)