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

如果您不想使用它,则抛出 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 回答
2

该方法getEntityManagerIJpaDao(或一个超级接口)中定义,这就是为什么您需要在您的类中提供它的实现。

如果它根本不使用(即,即使是通过您正在使用的某些框架内的某种反射机制),那么您可以将其从中删除,IJpaDao并且您不会被迫实施它。

于 2013-01-24T11:53:44.230 回答
1

我猜接口 IJpaDao 包含一个 getEntityManager 抽象方法。

于 2013-01-24T11:51:27.363 回答