如何知道一个类是否是@Entity(javax.persistence.Entity)?

时间:2018-03-15 19:25:34

标签: jpa entity instanceof

如何知道某个类是否使用javax.persistence.Entity进行注释?

人(实体)

@Entity
@Table(name = "t_person")
public class Person {
...
}

的PersonManager

@Stateless
public class PersonManager {

    @PersistenceContext
    protected EntityManager em;

    public Person findById(int id) {
        Person person = this.em.find(Person.class, id);
        return person;
    }

我尝试使用以下

实例进行此操作
@Inject
PersonManager manager;

Object o = manager.findById(1);
o instanceof Entity  // false

然而结果是false,不应该是true

3 个答案:

答案 0 :(得分:1)

@ NiVer的回答是有效的。但是,如果此时没有session或sessionFactory,则可以使用Reflection。类似的东西:

printf("The integers in order are: %.0lf %.0lf %.0lf\n",
    (((((a)*((a)<=(b)) + (b)*((a)>(b)))))*(((((a)*((a)<=(b)) + (b)*((a)>(b)))))<=((c))) + ((c))*(((((a)*((a)<=(b)) + (b)*((a)>(b)))))>((c)))),
    (((((a)*((a)>=(b)) + (b)*((a)<(b)))))*(((((a)*((a)>=(b)) + (b)*((a)<(b)))))<=((c))) + ((c))*(((((a)*((a)>=(b)) + (b)*((a)<(b)))))>((c)))),
    (((((a)*((a)>=(b)) + (b)*((a)<(b)))))*(((((a)*((a)>=(b)) + (b)*((a)<(b)))))>=((c))) + ((c))*(((((a)*((a)>=(b)) + (b)*((a)<(b)))))<((c))))
);

答案 1 :(得分:1)

虽然现有答案提供了(某种程度上)工作解决方案,但应注意一些事项:

  1. 使用基于反射的方法意味着(a)性能开销和(b)安全限制(参见Drawbacks of Reflection)。

  2. 使用特定于ORM(此处:Hibernate)的方法会使代码可移植到其他执行环境,即应用程序容器或其他与客户相关的设置。

  3. 幸运的是,还有第三种 JPA - 检测某个Java类(类型)是否为(托管)@Entity的方法。这种方法利用javax.persistence.metamodel.MetaModel的标准化访问。有了它你就得到了方法

      

    设置&lt; EntityType&gt; getEntities();

    它仅列出使用@Entity注释的类型,这些类型由您使用的当前EntityManager实例检测到。对于EntityType的每个对象,都可以调用

      

    类&LT; ? &GT; getJavaType();

    出于演示目的,我很快编写了一个方法,该方法需要EntityManager(此处为em)的实例,无论是注入还是创建ad-hoc:

    private boolean isEntity(Class<?> clazz) {
        boolean foundEntity = false;
        Set<EntityType<?>> entities = em.getMetamodel().getEntities();
        for(EntityType<?> entityType :entities) {
            Class<?> entityClass = entityType.getJavaType();
            if(entityClass.equals(clazz)) {
                foundEntity = true;
            }
        }
        return foundEntity;
    }
    

    您可以在中心位置(例如Service类)提供此类方法(公共或受保护),以便应用程序组件轻松重用。上面的例子只是给出了一个针对纯 JPA 方法的目标。

    有关参考,请参阅JPA 2.1 specification的第5.1.1节(第218页)和第5.1.2节(第219f页)。

    希望它有所帮助。

答案 2 :(得分:0)

如果声明

$mail = new PHPMailer(true);
try {
    $debug = NULL;
    $mail->Debugoutput = function($str, $level) {
        $GLOBALS['debug'] .= "$level: $str\n";
    };
    $mail->isSMTP();
    $mail->Host = 'xxxxxxx';
    $mail->SMTPDebug = 2;
    $mail->SMTPAuth = true;
    $mail->Username = 'xxxxxx';
    $mail->Password = 'xxxxxx';
    $mail->SMTPSecure = 'tls';
    $mail->Port = 587;
    $mail->setFrom('xx-xx@xx.com', 'xxx');
    $mail->addAddress('xx-xx@xx.com');
    $mail->isHTML(true);
    $mail->Subject = 'xx';
    $email_content = '<p>test</p>';
    $mail->Body = $email_content;
    $mail->send();
    fncSaveLog($debug);
} catch (Exception $e) {
    fncSaveLog($mail->ErrorInfo);
}

是真实的,而不是实体。