0

私はクラスにAbstractJpaDaoメソッドを持っていました

@Override
public EntityManager getEntityManager() {
    return em;
}

現在は使用されておらず、削除したかったのですが、エラーが発生します。

タイプは、クラスJpaAclIdentityDaoに継承された抽象メソッドを実装する必要があります。IJpaDao.getEntityManager()JpaAclIdentityDao

そのゲッターは必要ですか?そうでない場合はそれを削除する方法

私のコード:

public abstract class AbstractJpaDao implements IJpaDao {

protected final IApplicationConfig config;

protected final EntityManager em;

private final SingletonEventBus eventBus;

public AbstractJpaDao(EntityManager entityManager, IApplicationConfig config, SingletonEventBus eventBus) {
    checkArgument(entityManager != null);
    checkArgument(config != null);
    checkArgument(eventBus != null);
    this.em = entityManager;
    this.config = config;
    this.eventBus = eventBus;
}

protected void saveEntity(IEntity entity) {
    boolean isNew = entity.getId() == 0;
    em.getTransaction().begin();
    try {
        em.persist(entity);
        em.getTransaction().commit();
        if (isNew) {
            eventBus.post(new EntityCreatedEvent(entity));
        }
    } finally {
        if (em.getTransaction().isActive()) {
            em.getTransaction().rollback();
        }
    }
}



@Repository
public class JpaAclIdentityDao extends AbstractJpaDao implements IAclIdentityDao {



   public static final String GROUP_NAME_PATTERN = "GROUP_%d"; 

    private static final String GROUP_TEMP_NAME = "TEMP_GROUP_NAME"; 

@Inject
public JpaAclIdentityDao(EntityManager entityManager, IApplicationConfig config, SingletonEventBus eventBus) {
    super(entityManager, config, eventBus);
}

@Override
public AclIdentity findById(Object id) throws EntityNotFoundException {
    return em.find(AclIdentity.class, id);
}

@Override
public List<AclIdentity> findAll() {
    return findAllByType(AclIdentity.class);
}

@Override
public void delete(AclIdentity entity) {
    // TODO Auto-generated method stub
}

@Override
public void save(AclIdentity entity) {
    saveEntity(entity);
}

@Override
public AclIdentity createNew(String sid, boolean principal) {
    AclIdentity identity = new AclIdentity(sid, principal);
    save(identity);
    return identity;
}

@Override
public AclIdentity createNew(User entity) {
    return createNew(entity.getEmail(), true);
}

@Override
public AclIdentity createNew(Group entity) {
    AclIdentity identity = createNew(GROUP_TEMP_NAME, false);
    identity.setSid(String.format(GROUP_NAME_PATTERN, identity.getId()));
    save(identity);
    return identity;
}

}

4

4 に答える 4

4

はい、実装されたインターフェースで定義されているすべてのメソッドを実装する必要があります。私が考えることができる唯一の可能な解決策は、メソッドを実装して空のままにするか、インターフェイスを実装しないことです。または、ben75が言ったように、(どこでも)必要がない場合は、インターフェース「IJpaDao」の宣言でメソッドを削除するだけです。

于 2013-01-24T11:52:23.697 に答える
2

The method getEntityManager is defined in IJpaDao (or one super interface) that's why you need to provide an implementation of it in your class.

If it is not use at all (i.e. even by some reflection mechanism inside some frameworks you are using), then you can remove it from IJpaDao and you won't be forced to implement it.

于 2013-01-24T11:53:44.230 に答える
2

使用したくない場合は、UnsupportedOperationExceptionをスローします。

public class JpaAclIdentityDao extends AbstractJpaDao ... { // Or AbstractJpaDao...

    // Some Code...

    public EntityManager getEntityManager() {
        throw new UnsupportedOperationException();
        // return null; (This is not needed, due to the exception thrown above. Thanks dedek!)
    }

    // More Code...
}

OOプログラミングにより、具象クラスが抽象メソッドでクラス/インターフェースを継承する場合は、AbstractJpaDaoで行ったように、そのメソッド定義するか、クラスを抽象にしてラインに渡す必要があります。

于 2015-02-26T21:50:03.497 に答える
1

インターフェイスIJpaDaoにはgetEntityManager抽象メソッドが含まれていると思います。

于 2013-01-24T11:51:27.363 に答える